/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package ajustecurvas.controller;

import ajustecurvas.Ponto;
import java.util.ArrayList;
import java.util.List;

/**
 *
 * @author Matheus
 */
public class LogaritimicaAjusteController extends AjusteController{
  private int numerodePointos = 0;
  private ArrayList<Double> pontoLNX = new ArrayList<Double>();
  // private ArrayList<Double> pontoy2 = new ArrayList<Double>();
    private ArrayList<Double> pontoLNX2 = new ArrayList<Double>();
     private ArrayList<Double> pontoLNXxY = new ArrayList<Double>();
     private double SomaLNX = 0, SomaY = 0, Somay2 =0, SomaLNX2 =0, SomaLNXxY = 0, yMenosYajuste, SomayMenosYajuste = 0;
     private double a0, a1;
     ArrayList<Ponto> p = new ArrayList<Ponto>();
     ArrayList ponto = new ArrayList();
     Ponto get;
    @Override

    public List<Ponto> calcular(List<Ponto> medidas) {
        numerodePointos = medidas.size();
        SomaLNX = 0;
        SomaY = 0;
        Somay2 =0;
        SomaLNX2 =0;
        SomaLNXxY = 0;
        for (int i = 0; i < medidas.size(); i++) {
            get = medidas.get(i);
            pontoLNX.add(Math.log(get.getX()));//Ln(x)
            pontoLNX2.add(Math.pow(pontoLNX.get(i), 2));
            pontoLNXxY.add(pontoLNX.get(i)*get.getY());
            SomaLNX = SomaLNX + pontoLNX.get(i);
            SomaY = SomaY + get.getY();
            Somay2 =Somay2 + Math.pow(SomaY, 2);
            SomaLNX2 = SomaLNX2 + pontoLNX2.get(i);
            SomaLNXxY = SomaLNXxY + pontoLNXxY.get(i);


        }
        a0 = (SomaLNX2*SomaY - SomaLNX*SomaLNXxY)/(medidas.size()*SomaLNX2 - SomaLNX*SomaLNX);
        a1 = (medidas.size()*SomaLNXxY-SomaLNX*SomaY)/(medidas.size()*SomaLNX2 - SomaLNX*SomaLNX);

        for(int i=0; i<pontoLNX.size(); i++){
            get = medidas.get(i);
            Ponto p1 = new Ponto(get.getX(), a0 + a1 * pontoLNX.get(i));
            p.add(p1);
        }

        SomayMenosYajuste = 0;
        for(int i =0; i< medidas.size();i++){
             get = medidas.get(i);
        yMenosYajuste = Math.pow(get.getY()-(a0 + a1 * pontoLNX.get(i)), 2);
        SomayMenosYajuste = SomayMenosYajuste + yMenosYajuste;
        }
        return p;

    }

    @Override
    public String getEquacao() {

        return String.valueOf(a0) + " + " + "ln( "+String.valueOf(a1)+" )";
         }

    @Override
    public double getQualidade() {
          return (1- numerodePointos*SomayMenosYajuste/(numerodePointos*Somay2-Math.pow(SomaY, 2)));
    }

}
